import 'package:FlutterDemo/bean/bloc/datas_test_bloc.dart';
import 'package:flutter/material.dart';

/// Bloc
//       Bloc 可以方便的把样式与业务逻辑区分开，从而使开发更便捷，可重用性更好，测试也更加方便
/// Event
//       Event 事件作为 Bloc 的输入，一般是为了响应用户交互（例如按钮按下）或生命周期事件（例如页面加载）而添加它们。可以使用枚举类型定义事件类，对于相对复杂的事件可以联合业务定义为 class
/// States
//       States 状态作为 Bloc 的输出，一般用于 UI 状态的更新，页面更新绘制等；一般需要定义不同的数据类型来表示数据状态的变更；
/// Transitions
//       Transitions 转场作为从一个状态到下一个状态的过度，过渡由当前状态，事件和下一个状态组成；例如小菜上述定义的 TestEvent 中的各个 onEvent 中状态变更等均可以视为 Transitions 转场；onTransition 在 Bloc 的 state 更新之前被调用，常用于记录 Bloc 日志和分析；
/// Streams
//       作为异步数据传输；其中使用 async* 时可以使用 yield 关键字并返回一个 Stream 数据；
/// Blocs
//       Bloc 作为将 Stream 输入的 Event 事件转换为输出的 States 状态；每个自定义的 Bloc 必须继承自基础的 Bloc；通过复写 initialState 和 mapEventToState 方法来完成事件 Event 和 State 状态的转换；
//       initialState 为 Bloc 初始化状态，该状态是接收任何事件之前的状态；
//       mapEventToState 将 Event 作为参数，返回的是 Stream 的 state 状态，通过 state 属性随时访问当前的块状态；
//       每个 Bloc 都有一个 add 方法，用来添加新的 Event 到 mapEventToState 中；
//       Bloc 通过 onError 方法获取异常信息并处理等；
/// BlocDelegate
//       BlocDelegate 为 Bloc 的委托，可以在全局或需要的作用域范围内统一管理 onTransition 和 onError 等

/// https://www.jianshu.com/p/3970b84196a9
// https://pub.flutter-io.cn/packages/bloc
class SampleBloc1Widget extends StatefulWidget {
  const SampleBloc1Widget({Key? key}) : super(key: key);

  @override
  _SampleBloc1WidgetState createState() => _SampleBloc1WidgetState();
}

class _SampleBloc1WidgetState extends State<SampleBloc1Widget> {
  var _number = 0;

  NumberBloc _numberBloc = NumberBloc(0);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          Expanded(
              child: Center(
            child: Text(
              "当前 Number = $_number\n 下次 Number = ${_numberBloc.state}",
              style: TextStyle(fontSize: 20, color: Colors.blue),
            ),
          )),
          Container(
            alignment: Alignment.bottomRight,
            margin: EdgeInsets.fromLTRB(0, 0, 45, 45),
            child: FloatingActionButton(
              onPressed: () {
                _numberBloc.add(NumberEvent.addEvent);
                setState(() {
                  _number = _numberBloc.state;
                });
              },
              child: Icon(Icons.add),
            ),
          )
        ],
      ),
    );
  }
}
